# EnCoding:UTF-8
# 学生：黄俊学
# 学号：2021110773
# 班级：2137101
# 作业内容：猴子摘香蕉问题求解

class State:
	"""描述当前状态"""

	def __init__(self, pos_monkey="A", pos_box="B", pos_banana="C", monbox=False):
		"""状态初始化"""

		# 标记三个物体当前位置
		self.pos_monkey = pos_monkey
		self.pos_box = pos_box
		self.pos_banana = pos_banana

		# 标记谓词情况
		self.monbox = monbox
		self.holds_banana = False

	def at_pos(self, thing, pos):
		"""物体是否在指定位置"""
		if thing == "monkey":
			return self.pos_monkey == pos
		elif thing == "box":
			return self.pos_box == pos
		elif thing == "banana":
			return self.pos_banana == pos

	def run(self):
		"""运行"""
		i = 0
		while not self.holds_banana:
			i += 1

			if self.monbox:
				# 猴子在箱子上
				if self.pos_monkey == self.pos_banana:
					# 猴子和香蕉在同一位置，处于S3，执行reach转换到Sg，退出循环
					print(f"step{i}: 拿到香蕉了!")
					self.holds_banana = True
					break
				else:
					# 猴子和香蕉不在同一位置，就爬下箱子，转换到S1
					print(f"Step{i}: 从箱子上下来.")
					self.monbox = False

			else:
				# 猴子不在箱子上
				if self.pos_monkey == self.pos_box and self.pos_box != self.pos_banana:
					# 猴子在箱子旁边，处于S1，就执行movebox，转换到S2
					print(
						f"Step{i}: 将箱子移动到{pos_banana}.")
					self.pos_box = self.pos_banana
					self.pos_monkey = self.pos_banana
				elif self.pos_monkey == self.pos_box:
					# 猴子在箱子旁边，箱子在香蕉旁边，处于S2，就执行climbonto，转换到S3
					print(f"Step{i}: 猴子爬上箱子.")
					self.monbox = True
				else:
					# 猴子不在箱子旁边，处于S0，就执行monkeygoto，转换到S1
					print(f"Step{i}: 猴子爬到{self.pos_box}去拿箱子.")
					self.pos_monkey = self.pos_box
if __name__ == "__main__":
	print("帮小猴子够到香蕉吧！")

	# 输入
	pos_monkey = input("输入猴子位置：")
	pos_box = input("输入箱子位置：")
	pos_banana = input("输入香蕉位置：")
	monbox = False
	if pos_monkey == pos_box:
		on = input("猴子是否在箱子上(Y/N): ")
		# 在同一位置才可能站在箱子上，Y才允许有效
		if on == "Y":
			monbox = True
		else:
			monbox = False

	# 初始化状态
	state = State(pos_monkey, pos_box, pos_banana, monbox)

	# 问题运行求解
	state.run()
